package qc.module.ehs.api.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCConstant;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.ehs.dto.templatehazard.*;
import qc.module.ehs.service.EhsTplHazardcategoryService;
import qc.module.ehs.service.EhsTplHazarddbService;
import qc.module.ehs.service.EhsTplHazarditemService;
import qc.module.ehs.service.EhsTplHazardprojectService;
import qc.module.platform.dto.file.FileInfoDto;

import java.io.File;
import java.util.List;

/**
 * TemplateHazardController
 *
 * @author QuCheng Tech
 * @create 2024/5/22
 */
@RestController
@RequestMapping("/tplhazard")
public class TemplateHazardController {
    
    @Autowired
    private EhsTplHazarddbService hazarddbService;
    
    @Autowired
    private EhsTplHazardcategoryService hazardcategoryService;
    
    @Autowired
    private EhsTplHazardprojectService hazardprojectService;
    
    @Autowired
    private EhsTplHazarditemService hazarditemService;

    @Autowired
    private RestTemplatePlatform restTemplatePlatform;

    //******************危险源导则库接口********************************

    /**
     * 查询危险源导则库
     * 
     * @param condition 查询条件
     * @return List<TplHazardDbDto>
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/querydb",method = {RequestMethod.GET,RequestMethod.POST})
    public List<TplHazardDbDto> queryDB(@RequestBody TplHazardDbQueryConditionDto condition) throws QCPromptException {
        return hazarddbService.queryDB(condition);
    }

    /**
     * 查询导则库危险源清单TreeTable
     * 查询指定危险源导则库中的危险源清单，以TreeTable形式返回数据；可以指定类别、项目；返回结果中按照类别--项目--危险源层级结构进行返回；
     *
     * @param condition 查询条件
     * @return List<TplHazardTreeTableItemDto>
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/treetable",method = {RequestMethod.GET,RequestMethod.POST})
    public List<TplHazardTreeTableItemDto> queryTreeTable(@RequestBody TplHazardDbQueryConditionDto condition) throws QCPromptException {
        return hazarddbService.queryTreeTable(condition);
    }

    /**
     * 获取指定危险源导则库完整信息 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源导则库代码
     * @return TplHazardDbFullInfoDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getdbfull")
    public TplHazardDbFullInfoDto getDBFullByParam(@RequestParam String id) throws QCPromptException {
        return hazarddbService.getDBFull(id);
    }

    /**
     * 获取指定危险源导则库完整信息 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源导则库代码
     * @return TplHazardDbFullInfoDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getdbfull/{id}")
    public TplHazardDbFullInfoDto getDBFullByPath(@PathVariable String id) throws QCPromptException {
        return hazarddbService.getDBFull(id);
    }

    /**
     * 导入危险源导则库
     *
     * @param dto 导入条件
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/27
     */
    @RequestMapping(value = "/importdb",method = {RequestMethod.GET,RequestMethod.POST})
    public String importDB(@RequestBody TplHazardImportDto dto) throws Exception {
        
        if (dto == null) return QCUnifyReturnValue.Warn("查询条件不能为空");
        if (StringUtils.isBlank(dto.getHdbcd())) return QCUnifyReturnValue.Warn("危险源导则库代码不能为空");
        if (StringUtils.isBlank(dto.getFileid())) return QCUnifyReturnValue.Warn("文件ID不能为空");
        if (dto.getIsmajor() == null) return QCUnifyReturnValue.Warn("是否为重大危险源不能为空");
        if (dto.getIscover() == null) return QCUnifyReturnValue.Warn("覆盖模式导入不能为空");
        int fileId = Integer.parseInt(dto.getFileid());

        //根据上传文件ID获取文件信息并读取文件内容，解析处理数据
        FileInfoDto fileInfo = restTemplatePlatform.getFileById(fileId);
        if(!fileInfo.getExtension().equals("xlsx") && !fileInfo.getExtension().equals("xls")) {
            return QCUnifyReturnValue.Warn("请导入excel文件");
        }
        String fileFullPath = fileInfo.getPath() + QCConstant.ROUTE_SPLIT + fileInfo.getName() + "." + fileInfo.getExtension();
        File file = new File(fileFullPath);
        
        return hazarddbService.importDB(file,dto);
    }

    /**
     * 获取指定危险源导则库 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源导则库代码
     * @return TplHazardDbDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getdb")
    public TplHazardDbDto getDBByParam(@RequestParam String id) throws QCPromptException {
        return hazarddbService.getDB(id);
    }
    
    /**
     * 获取指定危险源导则库 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源导则库代码
     * @return TplHazardDbDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getdb/{id}")
    public TplHazardDbDto getDBByPath(@PathVariable String id) throws QCPromptException {
        return hazarddbService.getDB(id);
    }

    /**
     * 新增危险源导则库
     * 
     * @param dto 危险源导则库信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/adddb",method = {RequestMethod.GET,RequestMethod.POST})
    public String addDB(@RequestBody TplHazardDbDto dto){
        return hazarddbService.addDB(dto);
    }

    /**
     * 修改危险源导则库
     *
     * @param dto 危险源导则库信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/updatedb",method = {RequestMethod.POST,RequestMethod.PUT})
    public String updateDB(@RequestBody TplHazardDbDto dto){
        return hazarddbService.updateDB(dto);
    }

    /**
     * 删除危险源导则库 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除类别、项目、清单
     * 
     * @param id 危险源导则库代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @DeleteMapping("/deletedb")
    public String deleteDBByParam(@RequestParam String id){
        return hazarddbService.deleteDB(id);
    }

    /**
     * 删除危险源导则库 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除类别、项目、清单
     *
     * @param id 危险源导则库代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @DeleteMapping("/deletedb/{id}")
    public String deleteDBByPath(@PathVariable String id){
        return hazarddbService.deleteDB(id);
    }

    //******************危险源类别接口********************************

    /**
     * 获取指定危险源导则库的类别 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源导则库代码
     * @return List<TplHazardCategoryDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getcategories")
    public List<TplHazardCategoryDto> getDBCategoriesByParam(@RequestParam String id) throws QCPromptException {
        return hazardcategoryService.getDBCategories(id);
    }

    /**
     * 获取指定危险源导则库的类别 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源导则库代码
     * @return List<TplHazardCategoryDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getcategories/{id}")
    public List<TplHazardCategoryDto> getDBCategoriesByPath(@PathVariable String id) throws QCPromptException {
        return hazardcategoryService.getDBCategories(id);
    }

    /**
     * 获取指定危险源类别 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源类别代码
     * @return TplHazardCategoryDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getcategory")
    public TplHazardCategoryDto getCategoryByParam(@RequestParam String id) throws QCPromptException {
        return hazardcategoryService.getCategory(id);
    }

    /**
     * 获取指定危险源类别 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源类别代码
     * @return TplHazardCategoryDto
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @GetMapping("/getcategory/{id}")
    public TplHazardCategoryDto getCategoryByPath(@PathVariable String id) throws QCPromptException {
        return hazardcategoryService.getCategory(id);
    }

    /**
     * 新增指定危险源类别
     * 
     * @param dto 危险源类别信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/addcategory",method = {RequestMethod.GET,RequestMethod.POST})
    public String addCategory(@RequestBody TplHazardCategoryDto dto){
        return hazardcategoryService.addCategory(dto,false);
    }

    /**
     * 修改指定危险源类别
     *
     * @param dto 危险源类别信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @RequestMapping(value = "/updatecategory",method = {RequestMethod.POST,RequestMethod.PUT})
    public String updateCategory(@RequestBody TplHazardCategoryDto dto){
        return hazardcategoryService.updateCategory(dto);
    }

    /**
     * 删除指定危险源类别 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除该类别下的项目和清单
     *
     * @param id 危险源类别代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @DeleteMapping("/deletecategory")
    public String deleteCategoryByParam(@RequestParam String id){
        return hazardcategoryService.deleteCategory(id);
    }

    /**
     * 删除指定危险源类别 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除该类别下的项目和清单
     *
     * @param id 危险源类别代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/24
     */
    @DeleteMapping("/deletecategory/{id}")
    public String deleteCategoryByPath(@PathVariable String id){
        return hazardcategoryService.deleteCategory(id);
    }

    //******************危险源项目接口********************************

    /**
     * 获取指定危险源类别中的项目 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源类别代码
     * @return List<TplHazardProjectDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getprojects")
    public List<TplHazardProjectDto> getCategoryProjectsByParam(@RequestParam String id) throws QCPromptException {
        return hazardprojectService.getCategoryProjects(id);
    }

    /**
     * 获取指定危险源类别中的项目 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源类别代码
     * @return List<TplHazardProjectDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getprojects/{id}")
    public List<TplHazardProjectDto> getCategoryProjectsByPath(@PathVariable String id) throws QCPromptException {
        return hazardprojectService.getCategoryProjects(id);
    }

    /**
     * 获取指定危险源项目 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源项目代码
     * @return TplHazardProjectDto
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getproject")
    public TplHazardProjectDto getProjectByParam(@RequestParam String id) throws QCPromptException {
        return hazardprojectService.getProject(id);
    }

    /**
     * 获取指定危险源项目 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源项目代码
     * @return TplHazardProjectDto
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getproject/{id}")
    public TplHazardProjectDto getProjectByPath(@RequestParam String id) throws QCPromptException {
        return hazardprojectService.getProject(id);
    }

    /**
     * 新增指定危险源项目
     *
     * @param dto 危险源项目信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/addproject",method = {RequestMethod.GET,RequestMethod.POST})
    public String addProject(@RequestBody TplHazardProjectDto dto){
        return hazardprojectService.addProject(dto,false);
    }

    /**
     * 修改指定危险源项目
     *
     * @param dto 危险源项目信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/updateproject",method = {RequestMethod.POST,RequestMethod.PUT})
    public String updateProject(@RequestBody TplHazardProjectDto dto){
        return hazardprojectService.updateProject(dto);
    }

    /**
     * 删除指定危险源项目 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除该类项目中的清单；
     * 
     * @param id 危险源项目代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/deleteproject")
    public String deleteProjectByParam(@RequestParam String id){
        return hazardprojectService.deleteProject(id);
    }

    /**
     * 删除指定危险源项目 - 同时支持@RequestParam与@PathVariable方式
     * 同时删除该类项目中的清单；
     *
     * @param id 危险源项目代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/deleteproject/{id}")
    public String deleteProjectByPath(@PathVariable String id){
        return hazardprojectService.deleteProject(id);
    }
    
    //******************危险源清单接口********************************

    /**
     * 获取指定危险源项目中的清单 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源项目代码
     * @return List<TplHazardItemDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getitems")
    public List<TplHazardItemDto> getProjectItemsByParam(@RequestParam String id) throws QCPromptException {
        return hazarditemService.getProjectItems(id);
    }

    /**
     * 获取指定危险源项目中的清单 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源项目代码
     * @return List<TplHazardItemDto>
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getitems/{id}")
    public List<TplHazardItemDto> getProjectItemsByPath(@PathVariable String id) throws QCPromptException {
        return hazarditemService.getProjectItems(id);
    }

    /**
     * 获取指定危险源清单 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源清单代码
     * @return TplHazardItemDto
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getitem")
    public TplHazardItemDto getItemByParam(@RequestParam String id) throws QCPromptException {
        return hazarditemService.getItem(id);
    }

    /**
     * 获取指定危险源清单 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源清单代码
     * @return TplHazardItemDto
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @GetMapping("/getitem/{id}")
    public TplHazardItemDto getItemByPath(@PathVariable String id) throws QCPromptException {
        return hazarditemService.getItem(id);
    }

    /**
     * 新增指定危险源清单
     * 
     * @param dto 危险源清单信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/additem",method = {RequestMethod.GET,RequestMethod.POST})
    public String addItem(@RequestBody TplHazardItemDto dto){
        return hazarditemService.addItem(dto,false);
    }

    /**
     * 修改指定危险源清单
     * 
     * @param dto 危险源清单信息
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @RequestMapping(value = "/updateitem",method = {RequestMethod.POST,RequestMethod.PUT})
    public String updateItem(@RequestBody TplHazardItemDto dto){
        return hazarditemService.updateItem(dto);
    }

    /**
     * 删除指定危险源清单 - 同时支持@RequestParam与@PathVariable方式
     * 
     * @param id 危险源清单代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/deleteitem")
    public String deleteItemByParam(@RequestParam String id){
        return hazarditemService.deleteItem(id);
    }

    /**
     * 删除指定危险源清单 - 同时支持@RequestParam与@PathVariable方式
     *
     * @param id 危险源清单代码
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/5/23
     */
    @DeleteMapping("/deleteitem/{id}")
    public String deleteItemByPath(@PathVariable String id){
        return hazarditemService.deleteItem(id);
    }
}
